﻿using Xejen.Communication.Configuration;
using Xejen.Communication.Ftp.Configuration;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Text;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;

namespace Xejen.Communication.Ftp.Abstract
{
    /// <summary>
    /// 表示Ftp请求提供器
    /// </summary>
    /// <creator>marc</creator>
    public interface IFtpInvoker
    {
        /// <inheritdoc cref="Xejen.Communication.Ftp.Configuration.FtpConfig"/>
        FtpConfig Config { get; set; }

        /// <summary>
        /// 将文件上载到FTP服务器的FTP STOR协议方法。
        /// </summary>
        /// <typeparam name="TInput">输入参数的类型</typeparam>
        /// <param name="address">请求的地址信息</param>
        /// <param name="progress">进度报告</param>
        /// <param name="input">待发送的数据对象</param>
        /// <param name="timeout">超时时间，单位：毫秒</param>
        /// <param name="cancellationToken">是否取消的令牌</param>
        /// <returns></returns>
        Task<FtpResponse> UploadFileAsync<TInput>(FtpAddress address, TInput input, IProgress<IProgressData> progress, int timeout, CancellationToken cancellationToken);
        /// <summary>
        /// 用于将文件附加到FTP服务器上现有文件的FTP APPE协议方法。
        /// </summary>
        /// <param name="address">请求的地址信息</param>
        /// <param name="filePath">待附加的文件</param>
        /// <param name="timeout">超时时间，单位：毫秒</param>
        /// <param name="cancellationToken">是否取消的令牌</param>
        /// <returns></returns>
        Task<FtpResponse> AppendFileAsync(FtpAddress address, string filePath, int timeout, CancellationToken cancellationToken);
        /// <summary>
        /// 用于从FTP服务器下载文件的FTP RETR协议方法。
        /// </summary>
        /// <param name="address">请求的地址信息</param>
        /// <param name="progress">进度报告</param>
        /// <param name="localFilePath">本地的存放路径</param>
        /// <param name="timeout">超时时间，单位：毫秒</param>
        /// <param name="cancellationToken">是否取消的令牌</param>
        /// <returns></returns>
        Task<FtpResponse> DownloadFileAsync(FtpAddress address, string localFilePath, IProgress<IProgressData> progress, int timeout, CancellationToken cancellationToken);
        /// <summary>
        /// FTP MKD协议方法在FTP服务器上创建目录。
        /// </summary>
        /// <param name="address">请求的地址信息</param>
        /// <param name="timeout">超时时间，单位：毫秒</param>
        /// <param name="cancellationToken">是否取消的令牌</param>
        /// <returns></returns>
        Task<FtpResponse> MakeDirectoryAsync(FtpAddress address, int timeout, CancellationToken cancellationToken);
        /// <summary>
        /// 重命名文件的FTP RENAME协议方法。
        /// </summary>
        /// <typeparam name="TInput">输入参数的类型</typeparam>
        /// <param name="address">请求的地址信息</param>
        /// <param name="input">待发送的数据对象</param>
        /// <param name="timeout">超时时间，单位：毫秒</param>
        /// <param name="cancellationToken">是否取消的令牌</param>
        /// <returns></returns>
        Task<FtpResponse> RenameFileAsync<TInput>(FtpAddress address, TInput input, int timeout, CancellationToken cancellationToken);
        /// <summary>
        /// 用于删除FTP服务器上的文件的FTP DELE协议方法。
        /// </summary>
        /// <param name="address">请求的地址信息</param>
        /// <param name="timeout">超时时间，单位：毫秒</param>
        /// <param name="cancellationToken">是否取消的令牌</param>
        /// <returns></returns>
        Task<FtpResponse> DeleteFileAsync(FtpAddress address, int timeout, CancellationToken cancellationToken);
        /// <summary>
        /// 用于从FTP服务器上的文件中检索日期时间戳的FTP MDTM协议方法。
        /// </summary>
        /// <param name="address">请求的地址信息</param>
        /// <param name="timeout">超时时间，单位：毫秒</param>
        /// <param name="cancellationToken">是否取消的令牌</param>
        /// <returns></returns>
        Task<FtpResponse<DateTime?>> GetDateTimestampAsync(FtpAddress address, int timeout, CancellationToken cancellationToken);
        /// <summary>
        /// 用于检索FTP服务器上文件大小的FTP SIZE协议方法。
        /// </summary>
        /// <param name="address">请求的地址信息</param>
        /// <param name="timeout">超时时间，单位：毫秒</param>
        /// <param name="cancellationToken">是否取消的令牌</param>
        /// <returns></returns>
        Task<FtpResponse<long?>> GetFileSizeAsync(FtpAddress address, int timeout, CancellationToken cancellationToken);
        /// <summary>
        /// 获取FTP服务器上文件的简短列表的FTP NLIST协议方法。
        /// </summary>
        /// <param name="address">请求的地址信息</param>
        /// <param name="timeout">超时时间，单位：毫秒</param>
        /// <param name="cancellationToken">是否取消的令牌</param>
        /// <returns></returns>
        Task<FtpResponse<string[]>> ListDirectoryAsync(FtpAddress address, int timeout, CancellationToken cancellationToken);
        /// <summary>
        /// 获取FTP服务器上文件的详细列表的FTP LIST协议方法。
        /// </summary>
        /// <param name="address">请求的地址信息</param>
        /// <param name="timeout">超时时间，单位：毫秒</param>
        /// <param name="cancellationToken">是否取消的令牌</param>
        /// <returns></returns>
        Task<FtpResponse<string[]>> ListDirectoryDetailsAsync(FtpAddress address, int timeout, CancellationToken cancellationToken);
        /// <summary>
        /// 打印当前工作目录名称的FTP PWD协议方法。
        /// </summary>
        /// <param name="address">请求的地址信息</param>
        /// <param name="timeout">超时时间，单位：毫秒</param>
        /// <param name="cancellationToken">是否取消的令牌</param>
        /// <returns></returns>
        Task<FtpResponse<string>> PrintWorkingDirectoryAsync(FtpAddress address, int timeout, CancellationToken cancellationToken);
        /// <summary>
        /// 删除目录的FTP RMD协议方法。
        /// </summary>
        /// <param name="address">请求的地址信息</param>
        /// <param name="timeout">超时时间，单位：毫秒</param>
        /// <param name="cancellationToken">是否取消的令牌</param>
        /// <returns></returns>
        Task<FtpResponse> RemoveDirectoryAsync(FtpAddress address, int timeout, CancellationToken cancellationToken);
        /// <summary>
        /// 将具有唯一名称的文件上载到FTP服务器的FTP STOU协议。
        /// <para>
        /// 这个方法的使用是将本地某个文件，上传到服务端，服务端会生成一个随机的名字，通常类似于：{3A1F9F7E-B5CA-11EE-97A5-C858C0D823DF}.tmp<br/>
        /// 此名字是不由用户指定的，随机生成<br/>
        /// FtpAddress.Path，可以传空，那么将生成到根目录下，或者传文件夹名称，那么就生成到服务端指定的文件夹下
        /// </para>
        /// </summary>
        /// <param name="address">请求的地址信息</param>
        /// <param name="filePath">待上传的本地文件全路径</param>
        /// <param name="timeout">超时时间，单位：毫秒</param>
        /// <param name="cancellationToken">是否取消的令牌</param>
        /// <returns>返回值是服务端生成的新文件名</returns>
        Task<FtpResponse<string>> UploadFileWithUniqueNameAsync(FtpAddress address, string filePath, int timeout, CancellationToken cancellationToken);
    }
}
